As we approach the end of Spring 2022 semester,
I am already prepping for Summer 2022.
I will be teaching
CS 134: Programming Fundamentals
and
CS 200: Concepts of Programming Algorithms Using C++
I always like to try to improve my classes each semester and try
new things to see if I can teach C++ more effectively, and I have
some ideas for the classes I'm teaching in the summer.
Thoughts
- I want to have all the assignments prepped before the semester begins. I may do videos during the semester, but I want to have the assignments up and ready.
- I'm replacing quizzes with "Concept Introduction" assignments, which still use the Canvas quiz builder, but are more for introducing concepts and asking questions to make sure they understand.
- For CS134 and CS200 we're going to use repl.it for programming. In the past, I've had my CS200 students using Visual Studio or Code::Blocks as well as git.
- For CS200 we're going to first focus on writing command line programs that take in arguments.
- For both classes we're going to focus on storing and working with data before we get into control flow
Concept Introductions
So I'm replacing very traditional style quizzes with "Concept Introductions" using
Canvas' new quiz system and the "Stimulus" type to create text/images to go
along with a set of questions. I'm also using this with the "one question at a time"
view, but allowing students to back track. They can also take the assignment
multiple times to get a higher score, as a way to help them reinforce basic concepts.
What I'm hoping this does is basically give them a concise overview of what
they would be reading in the book or watching in the lectures, but have a way
that I can verify that they actually went through that information.
Additionally, I'm adding questions based around common pitfalls so that hopefully
they'll see the errors early on and I can reduce the amount of students getting
the same common error and being confused.
repl.it and writing command line programs
Previously in my CS200 classes I've had students using Visual Studio or
Code::Blocks or, if on a mac, XCode and also utilizing git to back up and
submit their work to me. For this summer, I'm writing new exercises to
utilize the repl.it C++ editor, and also teaching them a bit about the shell
and writing command line programs.
I'm doing this first off to emphasize that a lot of programming is
taking inputs, doing some processing, and generating
some outputs. I think that this idea gets lost when students
get too bogged down in designing a looping program that immitates how software
we use these days work.
By creating small programs that take in arguments, we are seeing that the
program needs information as input to operate off of, and there can be
some expected output or result.
Additionally, this will prepare them to see git in CS235
or CS250, and understand that git is a command line program and that we
pass arguments into the git program like add
, commit
and push
.
Data first, control flow later
My current plan for my CS200 summer schedule is this:
- Unit 0: Welcome and setup
- Unit 1: Computer basics and history
- Unit 2: C++ basics (main, variables, data types, cin, cout)
- Unit 3: Storing data in structs, saving data to text files
- Unit 4: Storing data in arrays, loading text files
- Unit 5: Pointers and memory
- Unit 6: The INs and OUTs of functions
- Unit 7: Classes and object oriented programming
- Unit 8: Putting it all together
I don't have a dedicated section to control flow. Instead, I'm going to introduce bits here and there as we need them, and focus more heavily on building a complete program during Unit 8.
I'm doing this because I felt like students were getting too bogged down
and getting confused over how to structure a program itself, but I want
them to be focusing on the features of the language this early in.
When they take CS 235: Object-Oriented Programming Using C++,
we can focus more on the architecture of a piece of software at that point.
At this point in the class, I want to make sure they're comfortable with the idea
of storing data in arrays and iterating over arrays, as well as the idea of
storing like-data in structs early on.
A big hurdle currently is that in my classes students begin with variables,
and then continue using their arrays like variables like this:
cout << "Movie 0: " << movieTitles[0] << endl;
cout << "Movie 1: " << movieTitles[1] << endl;
cout << "Movie 2: " << movieTitles[2] << endl;
And sure, it can be useful to see the wrong way of doing something before seeing the right way, but it seems like if they get into the habit of doing it wrong at first there is difficulty pulling them out of that mindset. So, we'll see how this goes.
Testing and solving challenges
I've already had my classes focus on testing and writing test cases
for the past few semesters, with my CS250 utilizing unit tests to verify
the students' data structures work properly.
By focusing more on the "inputs" and "outputs" of a program, I'm hoping that
students will be able to see a problem and think of it in terms of the inputs
and outputs, and be able to effectively create test cases - BEFORE implementing
the program itself.
From there, I'm hoping to be able to have students work on challenging programs,
but the challenge won't be from designing a program and menu and that structure,
the challenge will be solving small problems that are essentially in a vacuum -
or modular, like how a function should be designed.
With a smaller overall program, students can test purely based on the inputs
of the program without having to repeatedly navigate menus and re-enter data
and go through a multi-step process to validate their work. That can come later
on, like in CS235 (Fall semester goal: Really make them use the debugging tools!!)
Students being able to take a problem and then redefine it in terms of inputs
and expected outputs will also serve them beyond my classes - it is a useful
skill for any new challenge and during job interviews. I don't want them to
see a challenge and feel intimidated, I want them to have a process they can
rely on to begin analyzing the issues and developing ideas for how to approach it.
CS 134: Programming Fundamentals
I am planning on taking a similar approach with CS134, except not writing
programs with command line arguments... Or maybe I will, who knows?
But we're going to be working with Python in replit and still first
focusing on storing data before we get into heavy control flow.
I'm also thinking of having students work with some free APIs to see how
modern software operates. Python has some great libraries that are easy
to get started with, and I wish C++ had something built-in to do the same
because I would love to show my CS235 students APIs. (I do teach my students
to link a 3rd party library, but that's an optional assignment at the end
of the semester. It's optional because I just can't help Mac students
with this.)
Closing
Anyway, these are my big ideas for Summer 2022. I'm approaching this as a "new season" of CS 200,
and then my intention is to stick with the content throughout the next year and only make some
tweaks for quality and clarity. I end up redoing so much of my own work each semester, whether
that's adding a lot more documentation and testing to my courses, to changing to a
"Mastery, Satisfactory, Not Yet, Unassessable" style rubric
inspired by the Alternative Grading episodes of CD Ed Postcast.
At the same time, I need to give myself more of a break. I spent a ton of time on my class prep
and teaching work, and I always want to make things better, clearer, more efficient, etc.
but I don't need to be perfect... I need to pace myself lol.